﻿
namespace LM.TesteUnitario
{
    using LM.InterfacesFabricas.DTOs;
    using LM.InterfacesFabricas.Excecoes;
    using LM.InterfacesFabricas.Fabricas;
    using LM.InterfacesFabricas.Interfaces.Servicos;

    using NUnit.Framework;

    [TestFixture]
    class TestesServicoDeMarca
    {
        private IServicoDeMarca _servicoDeMarca;

        [SetUp]
        public void SetUp()
        {
            _servicoDeMarca = FabricaGenerica.Crie<IServicoDeMarca>();
        }

        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            LimpeDados();
        }

        [Test]
        public void TesteCadastreComSucesso()
        {
            LimpeDados();
            var dtoMarca = new DtoMarca { Codigo = 999, Descricao = "Marca 999" };

            _servicoDeMarca.Cadastre(dtoMarca);
        }

        [Test]
        [ExpectedException(typeof(InconsistenciasException))]
        public void TesteCadastreComInconsistencia()
        {
            var dtoMarca = new DtoMarca { Codigo = 1, Descricao = "" };

            _servicoDeMarca.Cadastre(dtoMarca);
        }

        [Test]
        public void TesteAtualizeComSucesso()
        {
            LimpeDados();
            InicializeDados();
            const string novaDescricao = "Nova descrição 999";

            var marca = _servicoDeMarca.Consulte(999);
            marca.Descricao = novaDescricao;
            _servicoDeMarca.Atualize(marca);

            marca = _servicoDeMarca.Consulte(999);
            Assert.AreEqual(novaDescricao, marca.Descricao);
        }

        [Test]
        public void TesteExcluaComSucesso()
        {
            LimpeDados();
            InicializeDados();

            var marca = _servicoDeMarca.Consulte(999);
            Assert.IsNotNull(marca);
            Assert.AreEqual(999, marca.Codigo);

            _servicoDeMarca.Exclua(999);
            marca = _servicoDeMarca.Consulte(999);

            Assert.IsNull(marca);
        }

        [Test]
        public void TesteConsulteTodosComSucesso()
        {
            LimpeDados();
            InicializeDados();

            Assert.Greater(FabricaGenerica.Crie<IServicoDeMarca>().ConsulteTodos().Count, 0);
        }

        private void InicializeDados()
        {
            FabricaGenerica.Crie<IServicoDeMarca>().Cadastre(new DtoMarca
                                                                 {
                                                                     Codigo = 999,
                                                                     Descricao = "Descrição 999"
                                                                 });
        }

        private void LimpeDados()
        {
            var servicoDeMarca = FabricaGenerica.Crie<IServicoDeMarca>();

            var marca = servicoDeMarca.Consulte(999);
            if (marca != null)
            {
                servicoDeMarca.Exclua(marca.Codigo);
            }
        }
    }
}
